SPDX-FileCopyrightText: 2016 Vasco Da Re SPDX-FileCopyrightText: 2024 AlICe laboratory https://alicelab.be
SPDX-License-Identifier: GPL-3.0-or-later
Developpe sous Blender 2.78 Script basé sur le projet de “City in the air” de Arata Isozaki
import bpy
import random
from random import *
import math
from math import radians
bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete(use_global=False)Definition de la fonction de création de camera en projection parallele#
def axoCam (projection,canon): bpy.ops.object.camera_add() maScene = bpy.context.scene.render monAxoCam = bpy.context.object monAxoCam.data.type = ‘ORTHO’ monAxoCam.data.ortho_scale = 1000 if projection == ‘axonometrique’: if canon == ‘dimetrie’: #OK monAxoCam.name = ‘axoDimetrie’ monAxoCam.rotation_euler = (radians(60), 0.0, radians(23)) monAxoCam.location = (5.53120, -13.04120, 8.18*120) maScene.pixel_aspect_x = 1 bpy.context.object.data.clip_end = 3000
axoCam (‘axonometrique’,’dimetrie’)
Ensemble des Mesures#
Mesures Principales des Piliers
Diametre_Pilier = 15
Hauteur_Base_Pilier = 28
Hauteur_Sommet_Pilier = 10
Hauteur_Pilier_1 = 50.6
Hauteur_Pilier_2 = 63.2
Hauteur_Pilier_3 = 75.8
Hauteur_Pilier_4 = 88.4
Hauteur_Pilier_5 = 101
Hauteur_Pilier_6 = 113.6
Hauteur_Pilier_7 = 126.2
Taille_Piliers = [
    Hauteur_Pilier_1,
    Hauteur_Pilier_2,
    Hauteur_Pilier_3,
    Hauteur_Pilier_4,
    Hauteur_Pilier_5,
    Hauteur_Pilier_6,
    Hauteur_Pilier_7,
]
print(Taille_Piliers)Angles des directions possibles
Angle_1 = 0
Angle_2 = 60
Angle_3 = 120
Angle_4 = 180
Angle_5 = 240
Angle_6 = 300
Liste_Angles_Impair = [Angle_1, Angle_3, Angle_5]
Liste_Angles_Pair = [Angle_2, Angle_4, Angle_6]
Liste_Angles_Totale = [Angle_1, Angle_2, Angle_3, Angle_4, Angle_5, Angle_6]Distance entre piliers
Distance_Min = 50.6707
Distance_Moy = 88.6644
Distance_Max = 126.6581
Distance_Pilier = [Distance_Min, Distance_Moy, Distance_Max]Suite de Piliers#
Definition de la fonction copier/coller pour les modules
def CopyPaste(Module, GM):
    bpy.context.scene.objects.active = bpy.data.objects[Module]
    obj = bpy.context.active_object
    Copy = bpy.data.objects.new(GM, obj.data)
    bpy.context.scene.objects.link(Copy)
    return CopyDefinition des piliers
l_piliers = []def PilierX(Position):
    if len(l_piliers) == 0:  # 1er Pilier
        px, py, pz = Position
        Hauteur = choice(Taille_Piliers)
        Position = (px, py, pz + Hauteur / 2)
        bpy.ops.mesh.primitive_cylinder_add(
            radius=Diametre_Pilier / 2, depth=Hauteur, location=Position
        )
        l_piliers.append((Position, Hauteur, choice(Liste_Angles_Totale)))
    else:  # Autres Piliers
        last_pilier = l_piliers[-1]
        Position, Hauteur, Angle = last_pilier
        X, Y, Z = Position
        Hauteur = choice(Taille_Piliers)  # Choix aleatoire de la hauteur du pilier
        Pos = choice(
            Distance_Pilier
        )  # Choix aleatoire de la distance entre les piliers
        if Angle == 0:  # Choix aleatoire des angles
            Angle2 = choice((300, 300, 0, 60, 60))
        if Angle == 60:
            Angle2 = choice((0, 0, 60, 120, 120))
        if Angle == 120:
            Angle2 = choice((60, 60, 120, 180, 180))
        if Angle == 180:
            Angle2 = choice((120, 120, 180, 240, 240))
        if Angle == 240:
            Angle2 = choice((180, 180, 240, 300, 300))
        if Angle == 300:
            Angle2 = choice((240, 240, 300, 0, 0))
        x = X + ((math.cos(math.radians(Angle2))) * Pos)  # Calcul des coordonnées
        y = Y + ((math.sin(math.radians(Angle2))) * Pos)
        Position = (x, y, 0 + Hauteur / 2)
        bpy.ops.mesh.primitive_cylinder_add(
            radius=Diametre_Pilier / 2, depth=Hauteur, location=Position
        )
        l_piliers.append((Position, Hauteur, Angle2))Apparition des modules
        dernier = l_piliers[-1]
        Position, Hauteur, Angle = dernier
        X, Y, Z = Position
        avant_dernier = l_piliers[-2]
        Position2, Hauteur2, Angle2 = avant_dernier
        x, y, z = Position2
        Hau_Max = min(
            Hauteur, Hauteur2
        )  # Choix des hauteurs des modules et de leur nombre
        if Hau_Max == Hauteur_Pilier_7:
            Hau_Mod = choice((40.6, 53.2, 65.8, 78.4))
            nbModule = choice((1, 2, 2, 2, 3, 3, 4))
        if Hau_Max == Hauteur_Pilier_6:
            Hau_Mod = choice((40.6, 53.2, 65.8, 78.4))
            nbModule = choice((1, 2, 2, 2, 3, 4))
        if Hau_Max == Hauteur_Pilier_5:
            Hau_Mod = choice((40.6, 53.2, 65.8))
            nbModule = choice((1, 2, 2, 2, 3))
        if Hau_Max == Hauteur_Pilier_4:
            Hau_Mod = choice((40.6, 53.2))
            nbModule = choice((1, 2, 2, 3))
        if Hau_Max == Hauteur_Pilier_3:
            Hau_Mod = choice((28, 40.6))
            nbModule = choice((1, 1, 2))
        if Hau_Max == Hauteur_Pilier_2:
            Hau_Mod = choice((28, 40.6))
            nbModule = 1
        if Hau_Max == Hauteur_Pilier_1:
            Hau_Mod = 28
            nbModule = 1Choix des tailles de modules en fonction de la distance entre les piliers
        if Pos == Distance_Min:
            Module = "PetitModule"
        if Pos == Distance_Moy:
            Module = "MoyenModule"
        if Pos == Distance_Max:
            Module = "GrandModule"Apparition des modules en fonction du nombre choisi
        if nbModule == 1:
            Coupure = choice((1, 1, 1, 1, 1, 1, 1, 1, 0, 0))  # Choix d'une coupure
            if Coupure == 1:
                pilier = CopyPaste(Module, "0")
                pilier.location = (x, y, Hau_Mod)
                pilier.rotation_euler = [0, 0, radians(Angle)]
            if Coupure == 0:
                pilier = 0
        if nbModule == 2:
            pilier = CopyPaste(Module, "0")
            pilier.location = (x, y, Hau_Mod)
            pilier.rotation_euler = [0, 0, radians(Angle)]
            pilier = CopyPaste(Module, "0")
            pilier.location = (x, y, Hau_Mod + 12.6)
            pilier.rotation_euler = [0, 0, radians(Angle)]
        if nbModule == 3:
            pilier = CopyPaste(Module, "0")
            pilier.location = (x, y, Hau_Mod)
            pilier.rotation_euler = [0, 0, radians(Angle)]
            pilier = CopyPaste(Module, "0")
            pilier.location = (x, y, Hau_Mod + 12.6)
            pilier.rotation_euler = [0, 0, radians(Angle)]
            pilier = CopyPaste(Module, "0")
            pilier.location = (x, y, Hau_Mod - 12.6)
            pilier.rotation_euler = [0, 0, radians(Angle)]
        if nbModule == 4:
            pilier = CopyPaste(Module, "0")
            pilier.location = (x, y, Hau_Mod)
            pilier.rotation_euler = [0, 0, radians(Angle)]
            pilier = CopyPaste(Module, "0")
            pilier.location = (x, y, Hau_Mod + 12.6)
            pilier.rotation_euler = [0, 0, radians(Angle)]
            pilier = CopyPaste(Module, "0")
            pilier.location = (x, y, Hau_Mod - 12.6)
            pilier.rotation_euler = [0, 0, radians(Angle)]
            pilier = CopyPaste(Module, "0")
            pilier.location = (x, y, Hau_Mod + 25.2)
            pilier.rotation_euler = [0, 0, radians(Angle)]
            print(nbModule)Génération du tout
for i in range(15):
    PilierX((0, 0, 0))
print(l_piliers)